package com.luo.backend.config;

import com.luo.backend.security.AdminAuthInterceptor;
import com.luo.backend.security.JwtAuthenticationFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Arrays;

/**
 * Web配置类
 */
@Configuration
@EnableWebSecurity
public class WebConfig implements WebMvcConfigurer {
    
    @Autowired
    private JwtAuthenticationFilter jwtAuthenticationFilter;
    
    @Autowired
    private AdminAuthInterceptor adminAuthInterceptor;
    
    /**
     * 密码编码器
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
    /**
     * RestTemplate Bean（用于HTTP请求，如调用百度AI API）
     */
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    /**
     * 安全配置
     */
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // ✅ 禁用CSRF（永远不要删除！RESTful API 使用 JWT 不需要 CSRF 保护）
            .csrf(csrf -> csrf.disable())
            // 配置跨域
            .cors().configurationSource(corsConfigurationSource())
            .and()
            // 配置会话管理
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            // 配置授权规则
            .authorizeHttpRequests(authz -> authz
                // 允许测试接口
                .antMatchers("/api/v1/test/**").permitAll()
                // 允许调试接口（仅开发环境）
                .antMatchers("/api/v1/debug/**").permitAll()
                // ✅ 允许所有认证相关接口（注册、登录、发送验证码、验证验证码等）
                .antMatchers("/api/v1/auth/**").permitAll()
                // 允许商家和商品查看接口（无需登录）
                .antMatchers("/api/v1/merchants/**", "/api/v1/foods/**", "/api/v1/food-categories").permitAll()
                // 允许分类接口（无需登录）
                .antMatchers("/api/v1/categories").permitAll()
                // 允许拼单活动查看接口（无需登录）
                .antMatchers("/api/v1/group-buying").permitAll()
                .antMatchers("/api/v1/group-buying/*/participants").permitAll()
                // 允许系统功能接口（无需登录）
                .antMatchers("/api/v1/home").permitAll()
                .antMatchers("/api/v1/system/config").permitAll()
                // 允许搜索接口（无需登录）
                .antMatchers("/api/v1/search").permitAll()
                .antMatchers("/uploads/**").permitAll()
                // 图片上传接口需要商家认证（在Controller中验证role）
                .antMatchers("/api/v1/upload/**").authenticated()
                // 商家端接口需要认证（在Controller中验证role）
                .antMatchers("/api/v1/merchant/**").authenticated()
                // 管理员接口需要认证（由拦截器处理）
                .antMatchers("/api/v1/admin/**").authenticated()
                // AI健康检查接口无需认证
                .antMatchers("/api/v1/ai/health").permitAll()
                // AI聊天接口需要认证
                .antMatchers("/api/v1/ai/**").authenticated()
                // 其他接口需要认证
                .anyRequest().authenticated()
            )
            // 添加JWT认证过滤器
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
            
        return http.build();
    }
    
    /**
     * 配置拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加管理员权限拦截器
        registry.addInterceptor(adminAuthInterceptor)
                .addPathPatterns("/api/v1/admin/**")  // 拦截所有管理员接口
                .order(1);  // 设置优先级
    }
    
    /**
     * 跨域配置
     */
    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOriginPatterns(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}
